package modelo.controles;

import java.util.ArrayList;
import java.util.Iterator;

import modelo.escenario.Ciudad;
import modelo.geometria.Circunferencia;
import modelo.geometria.Figura;
import modelo.geometria.Vector;
import modelo.obstaculos.Obstaculo;
import modelo.seniales.ISenial;
import modelo.vehiculos.Vehiculo;

import compartido.ITransaccion;

public abstract class Control extends Obstaculo implements ITransaccion {
	protected Circunferencia vision;
	protected ISenial senialAControlar;
	
	protected Control(Vector posicion, Figura cuerpo, double radioVision, ISenial senial) {
		super(cuerpo);
		this.vision = new Circunferencia(posicion, radioVision);
		this.senialAControlar = senial;
	}
	
	public abstract boolean detectoInfraccion();
		
 	public void analizar(Vehiculo vehiculo)
	{
 		if (senialAControlar != null)
 		{
 			if (!senialAControlar.cumple(vehiculo) && detectoInfraccion())
	 		{
	 				vehiculo.addInfraccion(senialAControlar.obtenerInfraccion());
	 		}
	 	}
	}
	
	@Override
	public int activar() {
		
		ArrayList<Vehiculo> transito = Ciudad.getCiudad().obtenerVehiculosCercanos(this);
		
		Iterator<Vehiculo> itr = transito.iterator();
		while (itr.hasNext()) {
		      analizar(itr.next());
		}
		return 0;
	}
	
	public ISenial getSenial(){
		
		return this.senialAControlar;
	}
	
	
	public Circunferencia getVision(){
	
		return this.vision;
	}
	
	
}
